package api

import (
	"context"
	"net/http"
	"urlshortener/internal/model"

	"github.com/labstack/echo/v4"
)

type URLService interface {
	CreateURL(ctx context.Context, req model.CreateURLRequest) (*model.CreateURLResponse, error)
	GetURL(ctx context.Context, shortCode string) (string, error)
}

type URLHandler struct {
	urlService URLService
}

func NewURLHandler(urlService URLService) *URLHandler {
	return &URLHandler{
		urlService: urlService,
	}
}

// post  /api/url  original_url custom_code  duration  传入这三个字段  ==》返回 url短链接  过期时间
// 将该方法 加到 URLHandler 结构体中
func (h *URLHandler) CreateURL(c echo.Context) error {

	//把数据提取
	var req model.CreateURLRequest       //声明结构体 赋值
	if err := c.Bind(&req); err != nil { //不传指针 不会修改结构体原来的值 只会在该函数中修改 不会修改原来值
		return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) //全局错误状态码  根据错误状态码进行返回
	}
	//验证数据格式
	if err := c.Validate(req); err != nil {
		return echo.NewHTTPError(http.StatusBadRequest, err.Error())
	}
	//调用业务函数
	resp, err := h.urlService.CreateURL(c.Request().Context(), req)
	if err != nil {
		return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
	}

	//返回响应
	return c.JSON(http.StatusCreated, resp)

}

// get  /code  短链接URL 重定向 长链接
func (h *URLHandler) RedirectURL(c echo.Context) error {
	//把code 取出来
	shortCode := c.Param("code")

	//shortcode ==> url调用业务函数
	originalURL, err := h.urlService.GetURL(c.Request().Context(), shortCode)
	if err != nil {
		return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
	}
	return c.Redirect(http.StatusPermanentRedirect, originalURL)

}
